import { BaseEditor } from './BaseEditor'
import { CellValue, ValidationResult } from '../types'

export class NumberEditor extends BaseEditor {
  protected input: HTMLInputElement | null = null

  protected createElement(value: CellValue): HTMLElement {
    const editOptions = this.getEditOptions()
    
    // 创建输入框
    this.input = document.createElement('input')
    this.input.type = 'text' // 使用 text 类型以避免数字精度问题
    this.input.inputMode = 'numeric' // 在移动设备上显示数字键盘
    
    // 设置属性
    if (editOptions.placeholder) {
      this.input.placeholder = editOptions.placeholder
    }
    
    if (editOptions.required) {
      this.input.required = true
    }
    
    if (editOptions.readonly) {
      this.input.readOnly = true
    }
    
    // 设置初始值（保持字符串格式）
    this.setValue(value)
    
    return this.input
  }

  getValue(): CellValue {
    if (!this.input) return null
    
    const value = this.input.value.trim()
    
    // 如果为空或只是负号，返回 null
    if (value === '' || value === '-') {
      return null
    }
    
    // 返回字符串以避免精度丢失
    const editOptions = this.getEditOptions()
    if (editOptions.precision === 0) {
      // 对于整数，移除小数部分
      return value.split('.')[0]
    }
    
    return value
  }
  
  setValue(value: CellValue): void {
    if (!this.input) return
    
    // 保持字符串格式
    if (value === null || value === undefined) {
      this.input.value = ''
    } else {
      this.input.value = String(value)
    }
    
    // 保存最后的有效值
    this.input.dataset.lastValidValue = this.input.value
  }
  
  protected customValidate(value: CellValue): ValidationResult {
    const strValue = value === null || value === undefined ? '' : String(value)
    
    // 空值验证
    if (strValue === '' || strValue === '-') {
      const editOptions = this.getEditOptions()
      if (editOptions.required) {
        return { valid: false, message: '此字段为必填项' }
      }
      return { valid: true }
    }
    
    // 验证是否为有效数字格式
    const editOptions = this.getEditOptions()
    const numberPattern = editOptions.precision === 0 
      ? /^-?\d+$/ // 整数
      : /^-?\d+\.?\d*$/ // 小数
      
    if (!numberPattern.test(strValue)) {
      return { valid: false, message: '请输入有效的数字' }
    }
    
    // 精度验证（小数位数）
    if (editOptions.precision !== undefined && editOptions.precision > 0) {
      const parts = strValue.split('.')
      if (parts.length > 1 && parts[1].length > editOptions.precision) {
        return { valid: false, message: `最多 ${editOptions.precision} 位小数` }
      }
    }
    
    // 注意：不进行数值范围验证，避免 JavaScript 精度问题
    // 范围验证应该在服务器端进行
    
    return { valid: true }
  }
  
  protected applyCustomStyles(): void {
    if (!this.input) return
    
    // 隐藏数字输入框的上下箭头
    this.input.style.webkitAppearance = 'none'
    ;(this.input.style as any).MozAppearance = 'textfield'
  }
  
  protected attachCustomEventListeners(): void {
    if (!this.input) return
    
    // 处理输入事件 - 只允许输入有效的数字字符
    this.input.addEventListener('input', (e) => {
      const target = e.target as HTMLInputElement
      let value = target.value
      
      const editOptions = this.getEditOptions()
      
      // 允许的字符：数字、小数点、负号
      const allowedPattern = editOptions.precision === 0 
        ? /^-?\d*$/ // 整数模式
        : /^-?\d*\.?\d*$/ // 小数模式
      
      // 如果输入不匹配模式，恢复到上一个有效值
      if (!allowedPattern.test(value) && value !== '' && value !== '-') {
        target.value = this.input!.dataset.lastValidValue || ''
        return
      }
      
      // 保存有效值
      this.input!.dataset.lastValidValue = value
      
      // 触发值变化回调
      if (this.onValueChange) {
        this.onValueChange(this.getValue())
      }
    })
    
    // 处理粘贴事件
    this.input.addEventListener('paste', (e) => {
      e.preventDefault()
      const pastedText = e.clipboardData?.getData('text/plain') || ''
      
      // 清理粘贴的文本
      let cleanedText = pastedText.trim()
      
      // 验证粘贴的内容是否为有效数字
      const editOptions = this.getEditOptions()
      const isValidNumber = editOptions.precision === 0
        ? /^-?\d*$/.test(cleanedText)
        : /^-?\d*\.?\d*$/.test(cleanedText)
        
      if (isValidNumber && cleanedText !== '' && cleanedText !== '-') {
        this.input!.value = cleanedText
        this.input!.dataset.lastValidValue = cleanedText
        
        // 触发值变化
        if (this.onValueChange) {
          this.onValueChange(this.getValue())
        }
      }
    })
    
    // 阻止滚轮事件改变数值
    this.input.addEventListener('wheel', (e) => {
      e.preventDefault()
    })
    
    // 处理键盘事件
    this.input.addEventListener('keydown', (e) => {
      // 阻止科学计数法
      if (e.key === 'e' || e.key === 'E') {
        e.preventDefault()
      }
    })
  }
} 